package main

import (
	"fmt"
	"os"
	"time"

	"bufio"

	"imooc.com/ccmouse/learngo/lang/functional/fib"
)

func tryDefer() {
	for i := 0; i < 100; i++ {
		defer fmt.Println(i)
		defer fmt.Println(i+1) // defer有一个栈，先进后出， 在return之前执行
		if i == 30 {
			// Uncomment panic to see
			// how it works with defer
			// panic("printed too many")
		}
	}
}

func writeFile(filename string) {
	file, err := os.OpenFile(filename,
		os.O_EXCL|os.O_CREATE|os.O_WRONLY, 0666) // 0666 是linux权限

		// err = errors.New("this is a custom error")  // 自定义异常
	if err != nil {
		// os.OpenFile 如果error，是*os.PathError类型
		if pathError, ok := err.(*os.PathError); !ok {
			panic(err)
		} else {
			fmt.Printf("%s, %s, %s\n",
				pathError.Op,
				pathError.Path,
				pathError.Err)
		}
		return
	}
	defer file.Close()

	writer := bufio.NewWriter(file)
	defer writer.Flush()

	f := fib.Fibonacci()
	for i := 0; i < 20; i++ {
		fmt.Fprintln(writer, f())
	}
}
func openFile() {
	startTime := time.Now()
	defer fmt.Println("duration:", time.Now().Sub(startTime)) // 这样得到结果是错的，微秒
	defer func() { // 这样在defer执行的时候，准备好的是必包函数，真正内部在结束时调用
		defer fmt.Println("duration:", time.Now().Sub(startTime))
	}()
	fileName := "/"
	file, err := os.Open(fileName)
	if err != nil {
		fmt.Println("error:", err)
		os.Exit(1)
	}
	file = nil
	defer file.Close() // file的值，等于执行到当前行，内存值
	defer func() {
		file.Close()  // 这样才是真正在执行完以后调用
	}()


}
func main() {
	openFile()
	//tryDefer()
	//writeFile("fib.txt")
}


